package com.iter.devbox.datastructure;

/**
 * 链式线性表-单链表
 * 单链表只需要知道下一个数据元素的位置即可
 * 
 * @author Jimly
 */
public class SingleLinklist {

	/**数据结点*/
	private Node node;
	
	/**结点个数*/
	private int nodeCount;
	
	/**默认构造方法*/
	public SingleLinklist() {
	}
	
	/**获取某个指定的结点*/
	public Object get(int i) {
		return node(i).item;
	}
	
	/**获取结点个数*/
	public int size() {
		return nodeCount;
	}
	
	/**添加一个结点*/
	public boolean add(Object object) {
		Node newNode = new Node(object, null);
		if (nodeCount<1) {
			this.node = newNode;
		} else {
			this.node(nodeCount-1).next = newNode;
		}
        nodeCount++;
		return true;
	}
	
	/**删除指定元素*/
	public boolean remove(int i) {
		if (i>0 && i<nodeCount) {
			if (i==nodeCount-1) {
				node(i-1).next = null;
				//this.node = node(i-1);
			} else {
				node(i-1).next = node(i+1);
			}
		} else if (i==0) {
			this.node = node(1);
		} else {
			throw new RuntimeException("越界异常");
		}
		nodeCount--;
		return true;
	}
	
	private Node node(int i) {
		Node node = this.node;
		for (int index=0; index<i; index++) {
			node = node.next;
		}
		return node;
	}
	
	/**由数据域+指针域构成的数据结点*/
	private static class Node {
		/**指向后一个数据元素的指针（后继元素）*/
		private Node next;
		/**具体数据*/
		private Object item;
		
		public Node(Object item, Node next) {
            this.item = item;
            this.next = next;
        }
	}
	
	/**main方法测试*/
	public static void main(String[] args) {
		SingleLinklist singleLinklist = new SingleLinklist();
		System.out.println("初始化：" + singleLinklist);
		singleLinklist.add("1");
		singleLinklist.add("2");
		singleLinklist.add("3");
		singleLinklist.add("4");
		singleLinklist.add("5");
		System.out.println("元素个数：" + singleLinklist.size());
		System.out.println("第i个元素：" + singleLinklist.get(3));
		
		singleLinklist.remove(4);
		System.out.println("删除一个元素后，元素个数：" + singleLinklist.size());
		String s = new String("12345");
		System.out.println(s);
	}
}